package com.tjcd.project.library_base.common.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.blankj.utilcode.util.LogUtils;
import com.blankj.utilcode.util.ObjectUtils;
import com.tjcd.project.library_base.base.bean.BaseHttpBean;
import com.tjcd.project.library_base.base.bean.BaseHttpPageBean;
import com.tjcd.project.library_base.base.bean.BaseResponseBean;

import java.util.ArrayList;

/**
 * @Author jiangKunKun
 * @CreateDate 2024/5/17
 * @Description 数据转换
 * @SpittingGrooves
 */
public class DataConversionUtils {

    /**
     * 处理标准数据
     * @param data 数据源
     * @param clazz 对应要返回的类
     * @return
     * @param <T> 返回数据类型
     */
    public static <T> T dataConversion(BaseResponseBean data, Class<T> clazz){
        if (data == null) {
            LogUtils.e("数据为空");
            return null;
        }
        try {
            // 将 BaseHttpEntity 的 data 属性转换为 JSON 对象
            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(((BaseHttpBean) data).getData()));

            // 从 JSON 对象中获取数据并转换为目标类型
            T result = jsonObject.toJavaObject(clazz);
            return result;
        } catch (Exception e) {
            LogUtils.e("处理数据异常: " + data.toString() + "\n" + e.toString());
        }
        return null;
    }

    /**
     *  "data": { "list": [] }
     * @param data
     * @param clazz
     * @return
     * @param <T>
     */
    public static <T> BaseHttpPageBean<T> dataConversionListPage(BaseResponseBean data, Class<T> clazz){
        if (data == null) {
            LogUtils.e("数据为空");
            return null;
        }
        BaseHttpPageBean baseHttpPageEntity = new BaseHttpPageBean();
        try {
            // 将 BaseHttpEntity 的 data 属性转换为 BaseHttpPageEntity
            baseHttpPageEntity = JSONObject.parseObject(
                    JSONObject.toJSONString(((BaseHttpBean) data).getData()),
                    BaseHttpPageBean.class
            );

            if (ObjectUtils.isEmpty(baseHttpPageEntity) || ObjectUtils.isEmpty(baseHttpPageEntity.getList())) {
                return createEmptyResult(clazz);
            }

            // 从 BaseHttpPageEntity 中获取 list 并转换为 JSONArray
            JSONArray jsonArray = JSONArray.parseArray(
                    JSONObject.toJSONString(baseHttpPageEntity.getList())
            );

            // 将 JSONArray 转换为指定类型的 ArrayList
            ArrayList<T> resultList = new ArrayList<>();
            for (Object obj : jsonArray) {
                T item = JSONObject.parseObject(obj.toString(), clazz);
                resultList.add(item);
            }

            // 更新 BaseHttpPageEntity 的 list 属性
            baseHttpPageEntity.setList(resultList);

            return baseHttpPageEntity;
        } catch (Exception e) {
            LogUtils.e("处理数据异常: " + data.toString() + "\n" + e.toString());
        }
        return baseHttpPageEntity;
    }
    // 辅助方法：创建空的结果对象
    private static <T> BaseHttpPageBean<T> createEmptyResult(Class<T> clazz) {
        BaseHttpPageBean<T> emptyPageEntity = new BaseHttpPageBean<>();
        emptyPageEntity.setList(new ArrayList<>());
        return emptyPageEntity;
    }

    /**
     * data[]
     * @param data 数据源
     * @param clazz 对应要返回的类
     * @return
     * @param <T> 直接返回适配数据集合
     */
    public static <T> ArrayList<T> dataConversionList(BaseResponseBean data, Class<T> clazz){
        if (data == null) {
            LogUtils.e("数据为空");
            return null;
        }
        ArrayList<T> result = new ArrayList<>();
        try {
            // 将 BaseHttpEntity 的 data 属性转换为 JSON 对象
            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(data));
            // 从 JSON 对象中获取 "data" 字段并转换为 JSONArray
            if (ObjectUtils.isEmpty(jsonObject)){
                return result;
            }
            JSONArray jsonArray = jsonObject.getJSONArray("data");

            // 将 JSONArray 转换为指定类型的 ArrayList
            if (ObjectUtils.isEmpty(jsonArray)){
                return result;
            }
            for (Object obj : jsonArray) {
                T item = JSONObject.parseObject(obj.toString(), clazz);
                result.add(item);
            }
        } catch (Exception e) {
            LogUtils.e("处理数据异常: " + data.toString() + "\n" + e.toString());
        }
        return result;
    }

}
